package cn.fantasy.singleton;

/**
 * @author ET
 * @description TODO
 * @date 2023/3/10 16:58
 * @Version V1.0
 *
 * 实现代码简洁。和双重检查单例对比，静态内部类单例实现代码真的是太简洁，又清晰明了。
 * 延迟初始化。调用getSingleton才初始化Singleton对象。
 * 线程安全。JVM在执行类的初始化阶段，会获得一个可以同步多个线程对同一个类的初始化的锁。
 *
 * 如何实现线程安全？
 * 线程A和线程B同时试图获得Singleton对象的初始化锁，假设线程A获取到了，那么线程B一直等待初始化锁。线程A执行类初始化，就算双重检查模式中伪代码发生了重排序，也不会影响线程A的初始化结果。初始化完后，释放锁。线程B获得初始化锁，发现Singleton对象已经初始化完毕，释放锁，不进行初始化，获得Singleton对象。
 *
 * 作者：新小梦
 * 链接：https://juejin.cn/post/6844903858276139021
 * 来源：稀土掘金
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public class Singleton1 {
    public Singleton1() {
    }
    public static Singleton getSingleton1() {
        return Inner.instance;
    }

    private static class Inner {
        private static final Singleton instance = new Singleton();
    }
}
